#include <REGX52.H>

sbit OneWire_DQ = P3^7;//引脚定义

/********************************************************************************************************/

/**
  * @brief   单总线初始化
  * @param   无
  * @retval  从机响应位，0为响应，1为未响应
  */
unsigned char OneWire_Init()
{
	unsigned char i = 0;			//延时需要
	unsigned char AckBit = 0;		//应答需要

	OneWire_DQ = 1;			//防止开始初始化的时候不是1
	OneWire_DQ = 0;			//拉低
	
	EA = 0;	//关闭中断，防止影响时序
	
	i = 227; while (--i);		//延时500us，最低位为480us，但保险起见
	OneWire_DQ = 1;				//释放
	
	i = 29;	while (--i);		//延时70us，取范围内的中间值
	AckBit = OneWire_DQ;		//接收应答
	i = 227; while (--i);		//延时500us，最低位为480us，但保险起见

	EA = 1;	//打开中断
	
	return AckBit;			//返回应答
}

/********************************************************************************************************/

/**
  * @brief   单总线发送一位
  * @param   Bit 要发送的位
  * @retval  无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i = 0;//延时需要

	EA = 0;	//关闭中断，防止影响时序
	
	OneWire_DQ = 0;		//拉低
	i = 3;while (--i);	//延时10us（从延时14us改的，调用一个函数大约4us）
	
	OneWire_DQ = Bit;	//代替if，颇为巧妙，注意理解
	i = 22;while (--i); //延时50us
	
	EA = 1;	//打开中断
	
	OneWire_DQ = 1;		//释放完成时序
}

/********************************************************************************************************/

/**
  * @brief   单总线接收一位
  * @param   无
  * @retval  读取的位
  */
unsigned char OneWire_ReceiveBit()
{
	unsigned char Bit = 0;	//用于接收数据
	unsigned char i = 0;//延时需要
	
	EA = 0;	//关闭中断，防止影响时序
	
	OneWire_DQ = 0;		//拉低
	i = 1;while (--i);	//延时5us
	
	OneWire_DQ = 1;     //释放
	i = 1;while (--i);	//延时5us，防止单总线还没有来得及变化
	
	Bit = OneWire_DQ;	//接收数据
	
	i = 22;while (--i);	//延时50us
	
	EA = 1;	//打开中断
	
	return Bit;
}

/********************************************************************************************************/

/**
  * @brief   单总线发送一个字节
  * @param   Byte 要发送的字节
  * @retval  无
  */
void OneWire_SendByte(unsigned char Byte)
{
	int i = 0;	//循环需要
	for (i = 0;i < 8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));//取位，注意单总线是从低位到高位
	}	
}

/********************************************************************************************************/

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte()
{
	unsigned char Byte = 0x00;//用于接收数据
	int i = 0;	//循环需要
	
	for (i = 0;i < 8;i++)
	{
		if (OneWire_ReceiveBit())
		{
			Byte |= (0x01 << i);	//注意理解这种接收数据的方式
		}			
	}
	return Byte;
}

/********************************************************************************************************/




























